package com.noelherrick;
import com.github.mustachejava.DefaultMustacheFactory;
import com.github.mustachejava.Mustache;
import com.github.mustachejava.MustacheFactory;
import com.noelherrick.urlrouter.*;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Map;
public abstract class MicraServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private UrlRouter<HttpHandler> getRouter = new UrlRouter<HttpHandler>();
private UrlRouter<HttpHandler> postRouter = new UrlRouter<HttpHandler>();
private UrlRouter<HttpHandler> deleteRouter = new UrlRouter<HttpHandler>();
private UrlRouter<HttpHandler> putRouter = new UrlRouter<HttpHandler>();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
handleRequest(getRouter, req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
handleRequest(postRouter, req, resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
handleRequest(putRouter, req, resp);
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
handleRequest(deleteRouter, req, resp);
}
private void handleRequest (UrlRouter<HttpHandler> router, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
MicraRequest micraRequest = new MicraServletRequest(req, this);
Match<HttpHandler> match = router.route(micraRequest);
if (match == null)
{
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
}
else
{
micraRequest.addRouteParameters(match.parameters);
String body = match.handler.handleHttpRequest(micraRequest, resp);
resp.getOutputStream().write(body.getBytes());
}
}
// Helper methods
protected Regex Regex(String regex)
{
return new Regex(regex);
}
protected RouteCondition AcceptJson ()
{
return (req) -> req.getHeader("Accept").contains("application/json");
}
protected String Mustache (String template, Map scopes)
{
StringWriter writer = new StringWriter();
MustacheFactory mf = new DefaultMustacheFactory();
Mustache mustache = mf.compile(new StringReader(template), template);
mustache.execute(writer, scopes);
writer.flush();
return writer.toString();
}
protected String MustacheView (String templateName, Map scopes)
{
ServletContext context = getServletContext();
String fullTemplatePath = context.getRealPath("/WEB-INF/"+templateName);
StringWriter writer = new StringWriter();
MustacheFactory mf = new DefaultMustacheFactory();
Mustache mustache = mf.compile(fullTemplatePath);
mustache.execute(writer, scopes);
writer.flush();
return writer.toString();
}
protected RouteCondition AcceptHtml ()
{
return (req) -> req.getHeader("Accept").contains("text/html");
}
private void addHendler (UrlRouter<HttpHandler> router, String pattern, HttpHandler handler)
{
Route<HttpHandler> route = new StringRoute<>(pattern, handler);
router.addRoute(route);
}
private void addHendler (UrlRouter<HttpHandler> router, String pattern, RouteCondition condition, HttpHandler handler)
{
Route<HttpHandler> route = new StringRoute<>(pattern, handler, condition);
router.addRoute(route);
}
private void addHendler (UrlRouter<HttpHandler> router, Regex regex, HttpHandler handler)
{
Route<HttpHandler> route = new RegexRoute<>(regex, handler);
router.addRoute(route);
}
private void addHendler (UrlRouter<HttpHandler> router, RouteCondition condition, HttpHandler handler)
{
Route<HttpHandler> route = new LambdaRoute<>(condition, handler);
router.addRoute(route);
}
// Get
protected void get (String pattern, HttpHandler handler)
{
addHendler(getRouter, pattern, handler);
}
protected void get (String pattern, RouteCondition condition, HttpHandler handler)
{
addHendler(getRouter, pattern, condition, handler);
}
protected void get (Regex regex, HttpHandler handler)
{
addHendler(getRouter, regex, handler);
}
protected void get (RouteCondition condition, HttpHandler handler)
{
addHendler(getRouter, condition, handler);
}
// Post
protected void post (String pattern, HttpHandler handler)
{
addHendler(postRouter, pattern, handler);
}
protected void post (String pattern, RouteCondition condition, HttpHandler handler)
{
addHendler(postRouter, pattern, condition, handler);
}
protected void post (Regex regex, HttpHandler handler)
{
addHendler(postRouter, regex, handler);
}
protected void post (RouteCondition condition, HttpHandler handler)
{
addHendler(postRouter, condition, handler);
}
// Put
protected void put (String pattern, HttpHandler handler)
{
addHendler(putRouter, pattern, handler);
}
protected void put (String pattern, RouteCondition condition, HttpHandler handler)
{
addHendler(putRouter, pattern, condition, handler);
}
protected void put (Regex regex, HttpHandler handler)
{
addHendler(putRouter, regex, handler);
}
protected void put (RouteCondition condition, HttpHandler handler)
{
addHendler(putRouter, condition, handler);
}
// Delete
protected void delete (String pattern, HttpHandler handler)
{
addHendler(deleteRouter, pattern, handler);
}
protected void delete (String pattern, RouteCondition condition, HttpHandler handler)
{
addHendler(deleteRouter, pattern, condition, handler);
}
protected void delete (Regex regex, HttpHandler handler)
{
addHendler(deleteRouter, regex, handler);
}
protected void delete (RouteCondition condition, HttpHandler handler)
{
addHendler(deleteRouter, condition, handler);
}
}